{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 有限元空间的自由度管理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 三角形网格上的自由度管理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "给定一个三角形网格 $\\mathcal T$,  $N$ 个网格节点，有 $NC$ 个三角形单元， $NE$ 个边。下面讨论 $\\mathcal T$ 上的 $p$ 次 Lagrange 有限元空间的自由度管理的问题。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在每个单元上自由度的个数：\n",
    "\n",
    "$$ldof = \\frac{(p+1)(p+2)}{2}$$\n",
    "\n",
    "其中顶点上有 3 个自由度， 每条边内部有 $p-1$ 个自由度， 单元内部有 \n",
    "\n",
    "$$ NI = \\frac{(p+1)(p+2)}{2} - 3 - 3(p-1) = ldof - 3p$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在 $\\mathcal T$ 上总的自由度个数为：\n",
    "\n",
    "$$\n",
    "N + (p-1)\\cdot NE + NI\\cdot NC\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 局部自由度编号\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 全局自由度编号"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 顶点上的自由度 $0：N-1$\n",
    "2. 第 $i$ 条边内部的自由度编号为 $$ N + (p-1)\\cdot i: N + (p-1)(i+1) - 1$$\n",
    "3. 第 $j$ 个单元内部的自由度编号为 $$ N + (p-1)\\cdot NE + NI\\cdot j : N + (p-1)\\cdot NE + NI\\cdot (j+1) - 1$$ "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 局部自由度编号与全局自由度编号之间的对应关系 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了组装矩阵和右端项的需要， 我们必须建立单元局部自由度编号和全局自由度之间的对应关系， 需要构建二个二维数组 `edge2dof` 和 `cell2dof`:\n",
    "\n",
    "* `edge2dof` 形状为 $NE \\times (p+1)$\n",
    "* `edge2dof[i, j]`, 表示第 $i$ 条边上第 $j$ 个局部自由度对应的全局自由度编号 \n",
    "* `cell2dof` 形状为 $NC \\times ldof$\n",
    "* `cell2dof[i, j]`, 表示第 $i$ 个单元第 $j$ 个局部自由度对应的全局自由度编号 \n",
    "\n",
    "![](figures/cell2dof.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
